package com.zzz.third;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

/*
 * @author zzr
 * @date: 2025/07/10  00:49
 * @description:给一个数组，一共有 n, 个数。你能进行最多 k次操作。每次操作可以进行以下步骤
 *              选择数组中的一个偶数 ai，将其变成 ai/2
 *              现在你进行不超过 k 次操作后，让数组中所有数之和尽可能小。
 *              请输出这个最小的和。
 * 思路：
 * 每次从堆中取出最大的元素，若为偶数则进行除以 2 的操作，更新总和并将新值放回堆中；
 * 若为奇数则跳过（因为奇数无法再操作）。重复此过程直到用完 k 次操作或堆中无偶数可操作。
 */
public class Demo3 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        long sum = 0; // long 防止整数溢出
        // 大根堆 按自然顺序逆序排列
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);

        for (int i = 0; i < n; i++) {
            int num = in.nextInt();
            sum += num;
            maxHeap.add(num);
        }
        while (k > 0 && !maxHeap.isEmpty()) {
            int currentMax = maxHeap.poll();
            if (currentMax % 2 != 0) {
                continue; // 奇数
            }
            int newVal = currentMax / 2;
            sum -= (currentMax / 2);
            maxHeap.add(newVal);
            k--;
        }
        System.out.println(sum);
    }
}
